package com.yn.club.common.util;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.util.StringUtils;

/**
 * web 常用工具
 *
 * @author Bing
 */
public class WebUtil {

  private static final Pattern QUERY_PARAM_PATTERN = Pattern.compile("([^&=]+)(=?)([^&]+)?");

  /**
   * 该方法传入query只支持传入参数部分，不支持完成url链接参数提取，此方法借鉴自
   * {@link org.springframework.web.util.UriComponentsBuilder}
   *
   * @param query query参数，a=x&b=xx
   * @return
   */
  public static Map<String, String> queryParamToMap(String query) {
    return queryParamToMap(query, LinkedHashMap::new);
  }

  /**
   * 该方法传入query只支持传入参数部分，不支持完成url链接参数提取，此方法借鉴自
   * {@link org.springframework.web.util.UriComponentsBuilder}
   *
   * @param query    query参数，a=x&b=xx
   * @param supplier 反参构造方法
   * @return
   */
  public static Map<String, String> queryParamToMap(String query,
      Supplier<Map<String, String>> supplier) {
    Map<String, String> map = supplier.get();
    if (StringUtils.hasText(query)) {
      Matcher matcher = QUERY_PARAM_PATTERN.matcher(query);
      while (matcher.find()) {
        String name = matcher.group(1);
        String eq = matcher.group(2);
        String value = matcher.group(3);

        map.put(name, (value != null ? value : (StringUtils.hasLength(eq) ? "" : null)));
      }
    }

    return map;
  }
}
